
public class Test {
    public static void main(String[] args) throws Exception {
        // getSuperclass获取父类
        // Integer的父类类型是Number，Number的父类是Object，Object的父类是null
        Class<?> i = Integer.class;
        Class<?> n = i.getSuperclass();
        System.out.println(n);
        Class<?> o = n.getSuperclass();
        System.out.println(o);
        System.out.println(o.getSuperclass());

        // 获取interface
        // 由于一个类可能实现一个或多个接口，通过Class我们就可以查询到实现的接口类型
        // getInterfaces()只返回当前类直接实现的接口类型，并不包括其父类实现的接口类型
        Class<?> s = Integer.class;
        Class<?>[] is = s.getInterfaces();
        for (Class<?> c : is) {
            System.out.println(c);
        }
        // 实例是否是某个类型时，可以使用instanceof关键字：
        Object n1 = Integer.valueOf(123);
        boolean isDouble = n1 instanceof Double; // false
        boolean isInteger = n1 instanceof Integer; // true
        boolean isNumber = n1 instanceof Number; // true

        // 如果是两个Class实例，要判断一个向上转型是否成立，可以调用isAssignableFrom()：
        // Integer i = ?
        Integer.class.isAssignableFrom(Integer.class); // true，因为Integer可以赋值给Integer
        // Number n = ?
        Number.class.isAssignableFrom(Integer.class); // true，因为Integer可以赋值给Number
        // Object o = ?
        Object.class.isAssignableFrom(Integer.class); // true，因为Integer可以赋值给Object
        // Integer i = ?
        Integer.class.isAssignableFrom(Number.class); // false，因为Number不能赋值给Integer

    }

}
